package cz.vse.po1715.lode.net.obecne;

import java.util.LinkedList;
import java.util.logging.*;

/*******************************************************************************
 * Instance třídy {@code FrontaUdálostí} představují prvky (herní události)
 * blokující fronty herních událostí
 *
 * @author    Dominik KOSTKA
 * @version   0.00.000
 */
public class FrontaUdálostí
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    private Logger log;
    private LinkedList události;
    private int počet = 0;
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *Konstruktor, který inicializuje logger a události
     */
    public FrontaUdálostí(String název)
    {
        log = Logger.getLogger("EventQueue: " + název);
	události = new LinkedList();
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /**
     * přidá událost do fronty událostí
     */
    public synchronized void pridej(IHerniUdalost událost) {
	//	log.debug("pridej " + event.hashCode());
	události.addLast(událost);
	notifyAll();
    }

    /**
     * blokuje vlákno instance dokud je fronta událostí prázdná
     * a následně odstraní první dostupnou událost z fronty událostí a vrátí ji
     */
    public synchronized IHerniUdalost vyjmi() throws InterruptedException {
	while (události.size() == 0) {
//	    count++;
	    //	    log.debug("waiting, count: " + count);
	    wait();
//	    count --;
        }

	IHerniUdalost událost = (IHerniUdalost) události.removeFirst();
	//	log.debug("vyjmi " + e.hashCode());
	return událost;
    }

    /**
     * vrátí počet událostí ve frontě událostí
     */
    public synchronized int getPocet() {
	return události.size();
    }

//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        FrontaUdálostí inst = new FrontaUdálostí();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
